package com.youth.framework.core;

import java.lang.reflect.Method;
import java.net.URL;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;

import com.youth.framework.util.ClassUtils;

public class License {
	private static Set<String> registered = new HashSet<String>();

	private String productName;
	private String productVersion;
	private String productCopyright;
	private String Terminal;
	private int simulnum = 0;
	private String serialNumber;
	
	private boolean invalid = true;

	static {
		// 康丽药业-药品库授权数字签名
		registered.add("CA7FA5ACC8C0A83CA947AA6CCE236A41");
		// 程学明-办公电脑授权数字签名
		registered.add("39962795EEC8933B6E69DC95240B6A4A");
		// 胡小童的电脑
		registered.add("65A66ABCF47C0B58A5A11E5C8B0A6DAD");
		// 公司演示机器授权签名
		registered.add("1E1CB8196655FCDAE2DDB9B271CFB155");
		// 淮南康宝
		registered.add("E12AA4874D0916F4FA966BC683642A6A");
		// 蚌埠爱康医药
		registered.add("E167CB2603C18155EC8AF27DB8A932F3");
		//祁门医药有限公司
		registered.add("EC4D3F55CB6B56E7F5C6779BB50AAE19");
		//8.66演示服务器
		registered.add("6ABB6BCF1C184ECA052C6946BC3B7588");
		// 安徽卫生实业
		registered.add("AC420B041E1EA02CD11469CD279EB351");
	    //徽州医药  
		registered.add("D3FE997BF4B74E6124E05D0FB6476D49");
	}
	public License(String server) {
		try {
			URL url = ClassUtils.getDefaultClassLoader().getResource(server + ".license");
			Method method = LicenseManager.class.getDeclaredMethod("extractLicense", URL.class);
			method.setAccessible(true);
			Properties props = (Properties) method.invoke(LicenseManager.class, url);

			this.productName = props.getProperty("product.name");
			this.productVersion = props.getProperty("product.version");
			this.productCopyright = props.getProperty("product.copyright");
			this.Terminal = props.getProperty("license.terminal");
			this.serialNumber = props.getProperty("license.sn");
			String num = props.getProperty("license.simulnum");
			if (num != null && num.matches("\\d+")) {
				this.simulnum = Integer.parseInt(num);
			}
			// 获取授权文件的数字签名（防止授权文件认为改动）
			String md5 = props.getProperty("MessageDigest");
			// 获取机器特征码数字签名（授权序列号）
			method = LicenseManager.class.getDeclaredMethod("extract");
			method.setAccessible(true);
			String license = (String) method.invoke(LicenseManager.class);
			
			// 当授权文件的数字签名和授权序列号都有效
			if (license != null && md5 != null) {
				// 并且授权文件的数字签名已经已经登记到系统和授权序列号与授权文件中的一致时
				// 说明本系统是经过授权的
				if (registered.contains(md5) && license.equals(this.serialNumber)) {
					this.invalid = false;
				}
			}
		} catch (Exception e) {
			//
		}
	}

	public boolean isInvalid() {
		return invalid;
	}

	public String getProductName() {
		return productName;
	}

	public String getProductVersion() {
		return productVersion;
	}

	public String getProductCopyright() {
		return productCopyright;
	}

	public String getTerminal() {
		return Terminal;
	}

	public int getSimulnum() {
		return simulnum;
	}

	public String getSerialNumber() {
		return serialNumber;
	}
}
